#ifndef BINANCEKLINECLIENT_H
#define BINANCEKLINECLIENT_H

#include <QObject>
#include <QtWebSockets>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
#include <QTimer>
#include <QDateTime>

// K线数据结构
struct KLineData {
    qint64 timestamp;      // 开盘时间
    double open;           // 开盘价
    double high;           // 最高价
    double low;            // 最低价
    double close;          // 收盘价
    double volume;         // 成交量
    qint64 closeTime;      // 收盘时间
    double quoteVolume;    // 成交额
    int trades;            // 成交笔数
    QString symbol;        // 交易对

    QString toString() const {
        return QString("时间: %1 | O: %2 H: %3 L: %4 C: %5 V: %6")
            .arg(QDateTime::fromMSecsSinceEpoch(timestamp).toString("MM-dd hh:mm"))
            .arg(open, 0, 'f', 2)
            .arg(high, 0, 'f', 2)
            .arg(low, 0, 'f', 2)
            .arg(close, 0, 'f', 2)
            .arg(volume, 0, 'f', 4);
    }
};

class BinanceKLineClient : public QObject
{
    Q_OBJECT

public:
    explicit BinanceKLineClient(QObject *parent = nullptr);
    ~BinanceKLineClient();

    // 连接WebSocket
    void connectToBinance(const QString& symbol = "btcusdt", const QString& interval = "1m");
    void disconnectFromBinance();

    // 订阅/取消订阅K线
    void subscribeKLine(const QString& symbol, const QString& interval);
    void unsubscribeKLine(const QString& symbol, const QString& interval);

    // 获取历史K线数据
    void fetchHistoricalData(const QString& symbol, const QString& interval, int limit = 500);

    // 获取当前K线数据
    QVector<KLineData> getKLineData() const { return m_klineData; }
    KLineData getLatestKLine() const { return m_latestKline; }

signals:
    void connected();
    void disconnected();
    void kLineDataReceived(const KLineData& data);
    void kLineUpdated(const KLineData& data);
    void historicalDataReceived(const QVector<KLineData>& data);
    void errorOccurred(const QString& error);

private slots:
    void onConnected();
    void onDisconnected();
    void onTextMessageReceived(const QString& message);
    void onError(QAbstractSocket::SocketError error);
    void reconnect();

private:
    QWebSocket *m_webSocket;
    QTimer *m_reconnectTimer;
    QVector<KLineData> m_klineData;
    KLineData m_latestKline;
    QString m_currentSymbol;
    QString m_currentInterval;
    bool m_isConnected;

    void setupWebSocket();
    void parseKLineMessage(const QJsonObject& obj);
    KLineData parseKLineArray(const QJsonArray& arr, const QString& symbol);
    void updateKLineData(const KLineData& newData);
};

#endif // BINANCEKLINECLIENT_H
